package milkproduction.service;

import java.util.HashMap;

import milkproduction.dao.ProductionProcessDAO;
import milkproduction.to.ContainerTO;
import milkproduction.to.MilkTO;
import milkproduction.to.RowMilkTO;
import miracom.one.MilkProduction.util.Impregnator;
import miracom.one.MilkProduction.util.Pavior;
import miracom.one.MilkProduction.util.Sterilizer;

public class ProductionProcessService{
	
	public ProductionProcessDAO dao;
	public ProductionProcessService(ProductionProcessDAO dao){
		this.dao = dao;
	}
	/**************일 기준*****************/
	public int totalAmount = 0;//오늘의 총 작업해야할 우유량
	public int totalbox = totalAmount/9;//오늘 필요한 박스의 수
	public int containerAmount =0;//총 사용할 용기량
	public int rowMilkAmount = 0;//원유 통에 남은 원유량
	public int completeMilk = 0; // 남아 있는 완성된 병의 갯수
	//현재까지 작업량
	public static double nowWorkAmoune=0; //현재까지 살균 처리 한양
	
	public boolean whileOnOff=true;
	int RowMilkNo=0 ;
	
	//일일 작업 완료 현황
	public static boolean daySterilizerWork=false;// 살균기 
	public static boolean dayImpregnatorWork=false;//주입기 
	public static boolean dayPaviorWork=false;//포장기 
	
	/**************기계 기준*****************/

	//기계 작업 횟수
	public static int sterilizerCnt = 0;//샬균기
	public static int impregnatorCnt = 0;//주입기
	
	//기계처리 기준량
	public final int throughput = 900;//각기계들이 한번에 처리할 양
	public int underThroughput=0; //기계가 한번에 처리해야 할 양이 throughput 이하일 경우의 양
	
	//기계 작업 여부 true = 작업중
	public static boolean sterilizerWork=false;// 살균기 
	public static boolean impregnatorWork=false;//주입기 
	public static boolean paviorWork=false;//포장기 
	
	//각 기계 한번 작업시 처리한양
	public static int sterilizerProgressAmount = 0; // 살균기 
	public static int  impregnatorProgressAmount = 0; //주입기 
	public static int paviorProgressAmount=0;//포장기 
	

	
	public static int milkAmount = 0;//생산된 우유 수량 - 주입기 에서 만들어지면 변경됨
	public static int packageCheck =0;//box 포장을 위해 9개가 되었는지 기다림
	public int packageMilk = 0;//Box가 된 우유 수량 
	public static int productMilkBox = 0;//완료된 우유 Box -  포장기에서 완료 되면 변경됨
	
	
	
	 
	//기계
	public Sterilizer sterilizer = null;//살균기
	public Impregnator impregnator = null;//주입기
	public Pavior pavior = null;//포장기
	
	//정보를 담을 객체
	RowMilkTO rmto = null; // 원유정보
	MilkTO mto = null;//우유정보
	ContainerTO cto = null;

	//공정 실행
	public String productionProcess(int totalAmount) throws Exception{
	    
		this.totalAmount = totalAmount;//오늘 작업량 총 작업량 표시
		this.totalbox = totalAmount/9;   // 오늘 필요한 물량(box)
		cto = dao.selectContainer();
		containerAmount = cto.getQuantity();//용기 가져 오기
		rmto = dao.selectRowMilk();//원유 살균 처리할 원유 확인
		this.rowMilkAmount = (int)rmto.getCapacity();//살균 처리할 원유량 등록
		this.RowMilkNo = rmto.getRowMilkNO();//원유 정보 no
		
		while(whileOnOff){
		
			//살균기 작동
		 if(!sterilizerWork&&rowMilkAmount>0){//비작업중이고 원유가 남아있는 경우
			sterilizerWork = true;//상태를 작업중으로 바꿔줌
			if(rowMilkAmount>=throughput){//남은 량이 900L 이상 일때
				sterilizer = new Sterilizer(RowMilkNo,throughput,dao);//원유를 900L 가져옴
			this.rowMilkAmount = rowMilkAmount - throughput;//남아 있는 원유양 조정
			System.out.println("1번");
			System.out.println(rowMilkAmount);
			}else{//남은 량이 900이하 일떄
				underThroughput = rowMilkAmount;
				sterilizer = new Sterilizer(RowMilkNo,underThroughput,dao);//남은 원유 다 가져옴
				this.rowMilkAmount = rowMilkAmount - underThroughput;
				System.out.println("2번");
				System.out.println(rowMilkAmount);
			}
			sterilizer.start();//기계 작동
		 }
		 //주입기 작동
		 if(!impregnatorWork){//비작업 중일떄
			if(sterilizerCnt!=0){
				 mto = dao.selectMilk();//살균 완료 우유 받아오기
				if(mto!=null){
				 dao.disposalChangeMilk();
				 impregnatorWork = true;//기게 작업 시작
				 if(mto.getCapacity()>=throughput){//남은 량이 900L 이상 일때
					 System.out.println("1111111"+mto.getCapacity());
				 impregnator = new Impregnator(mto.getCapacity(),containerAmount-throughput);
				 this.containerAmount = containerAmount - throughput;//사용 용기량 수정
				 }else{
					 System.out.println("22222222222"+mto.getCapacity());
					 underThroughput = mto.getCapacity();
					 impregnator = new Impregnator(mto.getCapacity(),containerAmount-underThroughput);
					 this.containerAmount = containerAmount - underThroughput;//사용 용기량 수정
				 }
				 impregnator.start();//기계작동
				 
				 }
			 }
		 }
		 
	
		 //포장기 작동
		 if(!paviorWork&&packageCheck>=9){
			 	System.out.println("패키지 수량 : "+packageCheck);
				packageCheck=packageCheck-9;//대기 장소 초기화
				paviorWork = true;//기계 작업 시작
				this.packageMilk = packageMilk+9;
				System.out.println("패키지 처리후 수량 : "+packageCheck);
				pavior = new Pavior();
				pavior.start();
			
		 }
		 if(sterilizerProgressAmount==totalAmount&&impregnatorProgressAmount==totalAmount&&productMilkBox==totalbox){
			 System.out.println("나오니??");
			 break;
		 }
		}//While 끝
		int finishedProductNo = dao.selectFinishedProductSqe();
		System.out.println("1 : "+finishedProductNo);
		System.out.println("2 : "+productMilkBox);
		System.out.println("3 : "+rmto.getRowMilkNO());
		System.out.println("4 : "+cto.getContainerNo());
		dao.insertFinishMilk(finishedProductNo, productMilkBox,rmto.getRowMilkNO(),cto.getContainerNo());
		return "작업이 완료 되었습니다";
	}
	//살균기 버튼
	public void sterilizerRunCheck(int sterilizerRunCheck) throws Exception{
		if(sterilizerRunCheck==0){
			sterilizerWork=false;
		}else{
			this.sterilizer.resume();
		}
	}
	//주입기 버튼
	public void impregnatorRunCheck(int impregnatorRunCheck) throws Exception{
		if(impregnatorRunCheck==0){
			this.sterilizer.wait();
		}else{
			this.sterilizer.resume();
		}
	}
	//포장기 버튼
	public void paviorRunCheck(int paviorRunCheck) throws Exception{
		if(paviorRunCheck==0){
			this.sterilizer.wait();
		}else{
			this.sterilizer.resume();
		}
	}
	public HashMap sterilizerMonitor() throws Exception{
		
		HashMap sterilizerInfo = new HashMap();
		
		
		/*double dayWorkRate = (totalAmount/nowWorkAmoune)*100;//일일 총 작업률
		int sterilizerWorkRate=0;//현재 기계의 작업률
		if(underThroughput!=0){//한번에 작업할수 있는 원유량 보다 적을 경우
			sterilizerWorkRate = (underThroughput/sterilizerProgressAmount)*100;
		}else{
			sterilizerWorkRate = (throughput/sterilizerProgressAmount)*100;
		}
		
		sterilizerInfo.put("dayWorkRate", dayWorkRate);//오늘 총 생산량
		sterilizerInfo.put("sterilizerWorkRate ", sterilizerWorkRate);//현재 작업량
*/		sterilizerInfo.put("sterilizerWork", sterilizerWork);//기계의 작업 여부
		sterilizerInfo.put("totalAmount", totalAmount);
		sterilizerInfo.put("nowWorkAmoune", nowWorkAmoune);
		
		return sterilizerInfo;
	}
	
	public HashMap impregnatorMonitor() throws Exception{
		
		HashMap impregnatorInfo = new HashMap();
		
		/*double dayWorkRate = (totalAmount/milkAmount)*100;//일일 총 작업률
		int impregnatorWorkRate=0;//현재 기계의 작업률
		if(underThroughput!=0){//한번에 작업할수 있는 원유량 보다 적을 경우
			impregnatorWorkRate = (underThroughput/impregnatorProgressAmount)*100;
		}else{
			impregnatorWorkRate = (throughput/impregnatorProgressAmount)*100;
		}*/
		impregnatorInfo.put("totalAmount", totalAmount);
		impregnatorInfo.put("milkAmount", milkAmount);
		/*impregnatorInfo.put("dayWorkRate", dayWorkRate);//오늘 총 생산량
		impregnatorInfo.put("impregnatorWorkRate ", impregnatorWorkRate);//현재 작업량
*/		impregnatorInfo.put("impregnatorWork", impregnatorWork);//기계의 작업 여부
		
		return impregnatorInfo;
	}
public HashMap paviorMonitor() throws Exception{
		
		HashMap paviorInfo = new HashMap();
		
		paviorInfo.put("productMilkBox", productMilkBox);
		paviorInfo.put("totalbox", totalbox);
		//double dayWorkRate = (totalbox/productMilkBox)*100;//일일 총 작업률
		
		//paviorInfo.put("dayWorkRate", dayWorkRate);//오늘 총 생산량
		//paviorInfo.put("paviorWork", paviorWork);//기계의 작업 여부
		
		return paviorInfo;
	}

	

	
	
}

